package com.example.demo.util;

import java.util.Random;

/**
 * 链路追踪ID工具类
 * 用于在整个请求生命周期中存储和获取链路追踪ID
 * 
 * @author zhang
 * @date 2024
 */
public class TraceIdUtil {
    
    /**
     * 使用ThreadLocal存储TraceId，确保线程安全
     */
    private static final ThreadLocal<String> TRACE_ID_THREAD_LOCAL = new ThreadLocal<>();
    
    /**
     * 随机数生成器
     */
    private static final Random RANDOM = new Random();
    
    /**
     * 生成新的TraceId
     * 格式: 24位十进制数字
     * 例如: 123456789012345678901234
     */
    public static String generateTraceId() {
        // 生成24位十进制数字
        long timestamp = System.currentTimeMillis(); // 13位时间戳
        
        // 生成11位随机数，确保总长度为24位
        long random = RANDOM.nextLong() % 100000000000L; // 11位随机数
        if (random < 0) {
            random = -random;
        }
        
        // 格式化为24位数字字符串
        String traceId = String.format("%013d%011d", timestamp, random);
        return traceId;
    }
    
    /**
     * 设置TraceId到当前线程
     */
    public static void setTraceId(String traceId) {
        TRACE_ID_THREAD_LOCAL.set(traceId);
    }
    
    /**
     * 获取当前线程的TraceId
     */
    public static String getTraceId() {
        return TRACE_ID_THREAD_LOCAL.get();
    }
    
    /**
     * 清除当前线程的TraceId
     * 在请求完成后调用，避免内存泄漏
     */
    public static void removeTraceId() {
        TRACE_ID_THREAD_LOCAL.remove();
    }
    
    /**
     * 获取TraceId，如果不存在则返回默认值
     */
    public static String getTraceIdOrDefault(String defaultValue) {
        String traceId = TRACE_ID_THREAD_LOCAL.get();
        return traceId != null ? traceId : defaultValue;
    }
    
    /**
     * 检查是否存在TraceId
     */
    public static boolean hasTraceId() {
        return TRACE_ID_THREAD_LOCAL.get() != null;
    }
}

